package motor;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle.Control;

import javax.swing.JPanel;

import jaxb_esquema_juego.Heroe;
import jaxb_esquema_juego.ImagenesHeroeD;
import jaxb_esquema_juego.ImagenesHeroeI;
import jaxb_esquema_juego.ImagenesZombieI;
import jaxb_esquema_juego.Jefe;
import jaxb_esquema_juego.Zombie;

public class PintarEscenario extends JPanel implements Runnable{
	
	BufferedImage fondo = null;
	BufferedImage zombie = null;
	BufferedImage stick = null;
	BufferedImage objeto = null;
	BufferedImage jefe = null;
	BufferedImage bala= null;
	int xHeroe = 0;
	public static PintarEscenario panel =new PintarEscenario();
	Thread hilo = null;
	int xZombie = 100;
	int xBala=0;
	int recorrerListaPintaZombies = 0;
	public static int cantidadZombies;
	public static List<PintarZombies> pintarZomb;
	Controlador control;
	Disparo disparo =new Disparo();
	boolean disparar = false, dispararD = false;
	int direccionHeroe = 2;
	boolean direccionBala = true;
	Double vidaStick = 100.0;
	int puntosTotales;
	

	
	
	public PintarEscenario() {
		PintarEscenario.panel.cantidadZombies = CargarJuego.escenario.getPanel().getCantidadZombies();
		hilo =new Thread(this);
		hilo.start();
		xHeroe = CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getCoordenadas().getX();
		xBala = xHeroe;
		crearZombies();
		control = Controlador.getInstance();
		
	}
	
	public void disparar(){
		if(direccionHeroe == 0 || direccionHeroe == 2)
		disparar = true;
		else if(direccionHeroe == 1 || direccionHeroe == 3)
			dispararD = true;
	}
	public void obtenerBala(String dir){
		ImageCache img = ImageCache.getInstance();
		bala = img.getImage(dir);
	}
	public void obtenerFondo(String direccion){
		ImageCache img = ImageCache.getInstance();
		fondo = img.getImage(direccion);
	}
	public void obtenerHeroe(String direccion){
		ImageCache img = ImageCache.getInstance();
		stick = img.getImage(direccion);
	}
	
	public void obtenerZombie(String direccion){
		ImageCache img = ImageCache.getInstance();
		zombie = img.getImage(direccion);
	}
	
	public void obtenerJefe(String direccion){
		ImageCache img = ImageCache.getInstance();
		jefe = img.getImage(direccion);
	}
	
	public void obtenerObjeto(String direccion){
		ImageCache img = ImageCache.getInstance();
		objeto = img.getImage(direccion);
	}
	public void moverStickDerecha(){
		xHeroe +=5;
		if(xHeroe>800)
			xHeroe = 800;
		direccionHeroe = 0;
	}
	public void moverStickIzquierda(){
		xHeroe -=5;
		if(xHeroe<10)
			xHeroe = 10;
		direccionHeroe = 1;
	}
	
	public void moverDefault(){
		if(direccionHeroe == 0)
			direccionHeroe = 2;
			else if(direccionHeroe == 1)
				direccionHeroe = 3;
	}
	public void pintaStick(){
	
		if(direccionHeroe == 0){
		for(ImagenesHeroeD heroe: CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getImagenesHeroeD()){
			obtenerHeroe(heroe.getImagen());
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			direccionBala = true;
			repaint();
		}
		}else if(direccionHeroe == 1){
			for(ImagenesHeroeI heroe: CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getImagenesHeroeI()){
				obtenerHeroe(heroe.getImagen());
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				direccionBala = false;
				repaint();
			}
			
		}else if(direccionHeroe == 2) {
			int i=0;
			for(ImagenesHeroeI heroe: CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getImagenesHeroeI()){
				obtenerHeroe(CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getImagenParadoD());
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				i++;
				direccionBala = true;
				repaint();
			}
		}else if(direccionHeroe == 3){
			for(ImagenesHeroeI heroe: CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getImagenesHeroeI()){
		
			obtenerHeroe(CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getImagenParadoI());
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			
			
			}
			direccionBala = false;
			repaint();
			}
		}
	}
		
	
	
 public void crearZombies(){
	 pintarZomb =new ArrayList<PintarZombies>();
	 int i=0;
	 while(i < CargarJuego.escenario.getPanel().getCantidadZombies()){
		 Zombie z = CargarJuego.escenario.getPanel().getPersonaje().getZombie();
		 pintarZomb.add(new PintarZombies(z));
		 i++;
		 }
 }
 
 
	
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		update(g);
	}
	
	@Override
	public void update(Graphics g) {

		Graphics2D g2d = (Graphics2D)g;
		control.actualizar(xHeroe, CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getCoordenadas().getBase(),g2d);
		g2d.drawImage(fondo,0,0,null);
		g2d.drawImage(stick, xHeroe, CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getCoordenadas().getY(), 
				CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getCoordenadas().getBase(),
				CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getCoordenadas().getAltura(),null);
		if(disparar && !dispararD){
		disparo.Dispara(g2d, xHeroe, xBala,direccionBala);
		xBala +=40;
		if(xBala > 200){
			xBala = 0;
			disparar = false;
			}
		}else if(dispararD){
			disparo.Dispara(g2d, xHeroe-60, xBala,direccionBala);
			xBala -=40;
			System.out.println(xBala);
			if(xBala < -200){
				xBala = 0;
				dispararD = false;
			}
		}
		
		
		int i=0;
		if(recorrerListaPintaZombies > pintarZomb.size()-1){
			recorrerListaPintaZombies = pintarZomb.size()-1;
		}
		if(cantidadZombies > 0){
			while(i <=recorrerListaPintaZombies){
				pintarZomb.get(i).pintar(g2d,xHeroe,CargarJuego.escenario.getPanel().getPersonaje().getHeroe().getCoordenadas().getBase(),i);
				if(disparar)
				control.colisionBala(pintarZomb.get(i),xBala,xHeroe,disparar);
				else
					control.colisionBala(pintarZomb.get(i),xBala,xHeroe,dispararD);
				i++;
				}
			
			
				
			}
		Double aux = vidaStick;
			String auxiliar = Double.toString(vidaStick);
			
		g2d.setFont(new Font("Times New Roman", Font.BOLD, 20));
			g2d.drawString("HP: "+auxiliar, 650,50);
			
			g2d.setFont(new Font("Times New Roman", Font.BOLD, 20));
			g2d.drawString("Puntos: "+ puntosTotales, 10,50);
		}
		
	@Override
	public void run() {
int j=0;
		while(true){
			
			pintaStick();

			j++;
			//recorrerá un segundo para aumentar j
			if(j == 5){
				recorrerListaPintaZombies+=1;
				j=0;
			}
			

		}
	}

}
